package com.coffee.core.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author Xulg
 */
public class MD5Util {
    private static Logger LOG = LoggerFactory.getLogger("debugAppender");

    private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    /**
     * MD5 加密
     *
     * @param str 字符串
     * @return 返回加密后的字符串
     */
    public static String getMD5Str(String str) {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(str.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            LOG.info("getMD5Str error", e);
        } catch (UnsupportedEncodingException e) {
            LOG.info("getMD5Str erro", e);
        }
        byte[] byteArray = messageDigest.digest();
        StringBuilder md5StrBuff = new StringBuilder();
        for (int i = 0; i < byteArray.length; i++) {
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
            } else {
                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
            }
        }
        return md5StrBuff.toString();
    }

    /**
     * MD5 GB2312加密
     *
     * @param str 字符串
     * @return 返回加密后的字符串
     */
    public static String getMD5StrGB2312(String str) {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(str.getBytes("GB2312"));
        } catch (NoSuchAlgorithmException e) {
            LOG.info("getMD5Str error", e);
        } catch (UnsupportedEncodingException e) {
            LOG.info("getMD5Str erro", e);
        }
        byte[] byteArray = messageDigest.digest();
        StringBuilder md5StrBuff = new StringBuilder();
        for (int i = 0; i < byteArray.length; i++) {
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
            } else {
                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
            }
        }
        return md5StrBuff.toString();
    }

    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname)) {
                resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
            } else {
                resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return resultString;
    }

    private static String byteArrayToHexString(byte b[]) {
        StringBuilder resultSb = new StringBuilder();
        for (int i = 0; i < b.length; i++)
            resultSb.append(byteToHexString(b[i]));

        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n += 256;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    public final static String getMessageDigest(byte[] buffer) {
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(buffer);
            byte[] md = mdTemp.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }

    public static String getMD5UUID(String params) {
        if (org.apache.commons.lang3.StringUtils.isEmpty(params)) {
            throw new RuntimeException("参数不能为空");
        }
        params = params.trim() + UserConstants.ENCRYPT_AUTH_KEY;
        return getMD5Str(params);
    }

    /**
     * chck password
     *
     * @param newStr    no encrypt password
     * @param oldMD5Str
     * @return
     */
    public final static boolean checkMD5(String newStr, String oldMD5Str) {
        String temp = getMD5Str(newStr);
        if (temp != null && temp.equals(oldMD5Str)) {
            return true;
        } else {
            return false;
        }
    }

    public static final class UserConstants {
        public static final String USER_LOCK = "locked";

        public static final String USER_UNLOCK = "active";

        public static final String ENCRYPT_AUTH_KEY = "{_ENCRYPT_AUTN_KEY_}";
        public static final String USER_HEAD_IMAGE_URL = "https://c1.51jujibao.cn/images/default_user.png";

        public static final String CARD_SECRET_KEY_PREFIX = "!@#$%%^%^df125$%$%$%$#%";
    }

}